package JackSu.常用类.java中的比较器;

import org.junit.Test;

import java.util.Arrays;
import java.util.Comparator;

import JackSu.常用类.java中的比较器.Goods;

public class _01Comparable和Comparator {

    /**
     * 在对象的比较中是使用Comparable和Comparator这两个接口
     * <p>
     * 1.包括像String类也是通过实现接口实现比较的
     * 2.重写CompareTo（obj）规则
     * 比较形参和当前对钱 返回+ — 0
     */

    @Test
    public void test1() {
        String[] str = new String[]{"AA", "CC", "BB", "FF"};
        Arrays.sort(str);
        System.out.println(Arrays.toString(str));

    }

    @Test
    public void test2() {

        Goods[] arr = new Goods[5];
        arr[0] = new Goods("mouse1", 12.5, "联想");
        arr[1] = new Goods("mouse2", 12.4, "华为");
        arr[2] = new Goods("mouse3", 12.3, "小米");
        arr[3] = new Goods("oouse4", 12.2, "逻辑");
        arr[4] = new Goods("nouse5", 12.2, "逻辑1");

        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));

    }

    /*
   Comparator接口的使用：定制排序
   1.背景：
   当元素的类型没有实现java.lang.Comparable接口而又不方便修改代码，
   或者实现了java.lang.Comparable接口的排序规则不适合当前的操作，
   那么可以考虑使用 Comparator 的对象来排序
   2.重写compare(Object o1,Object o2)方法，比较o1和o2的大小：
   如果方法返回正整数，则表示o1大于o2；
   如果返回0，表示相等；
   返回负整数，表示o1小于o2。

    */
    @Test
    public void test3(){
        String[] arr = new String[]{"AA","CC","KK","MM","GG","JJ","DD"};
        Arrays.sort(arr,new Comparator(){

            //按照字符串从大到小的顺序排列
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof String && o2 instanceof  String){
                    String s1 = (String) o1;
                    String s2 = (String) o2;
                    return -s1.compareTo(s2);
                }
//                return 0;
                throw new RuntimeException("输入的数据类型不一致");
            }
        });
        System.out.println(Arrays.toString(arr));
    }

    @Test
    public void test4(){
        Goods[] arr = new Goods[6];
        arr[0] = new Goods("lenovoMouse",34);
        arr[1] = new Goods("dellMouse",43);
        arr[2] = new Goods("xiaomiMouse",12);
        arr[3] = new Goods("huaweiMouse",65);
        arr[4] = new Goods("huaweiMouse",224);
        arr[5] = new Goods("microsoftMouse",43);

        Arrays.sort(arr, new Comparator() {
            //指明商品比较大小的方式:按照产品名称从低到高排序,再按照价格从高到低排序
            @Override
            public int compare(Object o1, Object o2) {
                if(o1 instanceof Goods && o2 instanceof Goods){
                    Goods g1 = (Goods)o1;
                    Goods g2 = (Goods)o2;
                    if(g1.getName().equals(g2.getName())){
                        return -Double.compare(g1.getPrice(),g2.getPrice());
                    }else{
                        return g1.getName().compareTo(g2.getName());
                    }
                }
                throw new RuntimeException("输入的数据类型不一致");
            }
        });

        System.out.println(Arrays.toString(arr));
    }



}
